home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / shells / scsh-0.4 / scsh-0 / scsh-0.4.2 / scsh / tty1.c < prev    next >
C/C++ Source or Header  |  1995-10-26  |  3KB  |  118 lines

  1. /* To do:
  2.  * - Replace explicit 8/24 splits with macros.
  3.  * - We need to pass the control-chars vecs in as Scheme
  4.  *   strings, and test the length before doing the memcpy.
  5.  */
  6.  
  7. /* 
  8.  * Scheme48/scsh terminal control interface.
  9.  * Routines that require custom C support.
  10.  * Copyright (c) 1995 by Brian D. Carlstrom
  11.  * Re-written by Olin.
  12.  */
  13.  
  14. #include <unistd.h>
  15. #include <termios.h>
  16. #include <string.h>
  17. #include <sys/types.h>
  18.  
  19. /* This #include is for the #ifdef'd code in open_ctty() below, and
  20. ** is therefor ifdef'd identically.
  21. */
  22. #if defined(TIOCSCTTY) && !defined(CIBAUD)
  23. #include <sys/ioctl.h>
  24. #endif
  25.  
  26. #include "tty1.h"    /* Make sure the .h interface agrees with the code. */
  27.  
  28. extern int errno;
  29.  
  30. /*****************************************************************************/
  31.  
  32. int scheme_tcgetattr(int fd,         char *control_chars,
  33.              int *iflag_hi8, int *iflag_lo24,
  34.              int *oflag_hi8, int *oflag_lo24,
  35.              int *cflag_hi8, int *cflag_lo24,
  36.              int *lflag_hi8, int *lflag_lo24,
  37.              int *ispeed,    int *ospeed)
  38. {
  39.   struct termios t;
  40.   int result = tcgetattr(fd, &t);
  41.   
  42.   if (result != -1) {
  43.       memcpy(control_chars, t.c_cc, NCCS);
  44.       *iflag_hi8 =t.c_iflag >> 24; *iflag_lo24=t.c_iflag & 0xffffff;
  45.       *oflag_hi8 =t.c_oflag >> 24; *oflag_lo24=t.c_oflag & 0xffffff;
  46.       *cflag_hi8 =t.c_cflag >> 24; *cflag_lo24=t.c_cflag & 0xffffff;
  47.       *lflag_hi8 =t.c_lflag >> 24; *lflag_lo24=t.c_lflag & 0xffffff;
  48.       *ispeed=cfgetispeed(&t);
  49.       *ospeed=cfgetospeed(&t);
  50.       }
  51.  
  52.   return result;
  53.   }
  54.  
  55.  
  56. /*****************************************************************************/
  57.  
  58. int scheme_tcsetattr(int fd,        int option,
  59.              const char *control_chars,
  60.              int iflag_hi8, int iflag_lo24,
  61.              int oflag_hi8, int oflag_lo24,
  62.              int cflag_hi8, int cflag_lo24,
  63.              int lflag_hi8, int lflag_lo24,
  64.              int ispeed,    int ospeed,
  65.              int min,        int time)
  66. {
  67.   struct termios t;
  68.  
  69.   memcpy(t.c_cc, control_chars, NCCS);
  70.  
  71.   /* This first clause of this conditional test will hopefully
  72.   ** resolve the branch at compile time. However, since VMIN/VEOF
  73.   ** and VTIME/VEOL are allowed by POSIX to colllide, we have to check.
  74.   ** If they do collide, we set EOF & EOL in canonical mode, and MIN & TIME
  75.   ** in raw mode. Ah, Unix.
  76.   */
  77.  
  78.   if( (VMIN != VEOF && VTIME != VEOL) || !(t.c_lflag & ICANON) ) {
  79.       t.c_cc[VMIN] = min;
  80.       t.c_cc[VTIME] = time;
  81.       }
  82.  
  83.   t.c_iflag = (iflag_hi8 << 24) | iflag_lo24;
  84.   t.c_oflag = (oflag_hi8 << 24) | oflag_lo24;
  85.   t.c_cflag = (cflag_hi8 << 24) | cflag_lo24;
  86.   t.c_lflag = (lflag_hi8 << 24) | lflag_lo24;
  87.  
  88.   cfsetispeed(&t, ispeed);
  89.   cfsetospeed(&t, ospeed);
  90.  
  91.   return tcsetattr(fd, option, &t);
  92. }
  93.  
  94.  
  95. /*****************************************************************************/
  96.  
  97. int open_ctty(const char *ttyname, int flags)
  98. {
  99.     int fd = open(ttyname, flags);
  100.  
  101. /* The ifdef is tricked by HP-UX, so I'll hardwire it out for now. -Olin */
  102. #if 0
  103. #if defined(TIOCSCTTY) && !defined(CIBAUD)
  104.     fprintf(stderr, "Doing the ioctl.\n");
  105.     /* 4.3+BSD way to acquire control tty. !CIBAUD rules out SunOS.
  106.     ** This code stolen from Steven's *Advanced Prog. in the Unix Env.*
  107.     */
  108.     if( (fd >= 0) && (ioctl(fd, TIOCSCTTY, (char *) 0) < 0) ) {
  109.     int e = errno;
  110.     close(fd);
  111.     errno = e;
  112.     return -1;
  113.     }
  114. #endif
  115. #endif
  116.     return fd;
  117.     }
  118.